package br.com.sig.financeiro.despesa.business.model.entity;

import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;

import br.com.sig.business.model.entity.BaseEntity;
import br.com.sig.financeiro.business.model.enumeration.FormaDePagamento;
import br.com.sig.financeiro.despesa.business.model.enumeration.TipoDeDespesa;

@Entity
@Table(schema="sig_financeiro", name="despesa")
@Inheritance(strategy = InheritanceType.JOINED)
public class Despesa extends BaseEntity {

	private static final long serialVersionUID = 6577164747149904633L;
	
	private Date vencimento;
	private TipoDeDespesa tipo;
	private String descricao;
	private BigDecimal valor;
	private FormaDePagamento formaDePagamento;
	private Date dataDePagamento;
	private String observacao;
	
	@NotNull
	@Column(nullable = false)
	@Temporal(TemporalType.DATE)
	public Date getVencimento() {
		return vencimento;
	}
	
	public void setVencimento(Date vencimento) {
		this.vencimento = vencimento;
	}
	
	@NotNull
	@Enumerated(EnumType.STRING)
	@Column(name = "tipo_despesa", nullable = false)	
	public TipoDeDespesa getTipo() {
		return tipo;
	}
	
	public void setTipo(TipoDeDespesa tipo) {
		this.tipo = tipo;
	}
	
	@NotNull
	@Column(nullable = false)	
	public String getDescricao() {
		return descricao;
	}
	
	public void setDescricao(String descricao) {		
		this.descricao = descricao;
	}
	
	@NotNull
	@Column(nullable = false, scale = 2)	
	public BigDecimal getValor() {
		return valor;
	}

	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}
	
	@NotNull
	@Enumerated(EnumType.STRING)
	@Column(name = "forma_pagamento", nullable = false)
	public FormaDePagamento getFormaDePagamento() {
		return formaDePagamento;
	}

	public void setFormaDePagamento(FormaDePagamento formaDePagamento) {
		this.formaDePagamento = formaDePagamento;
	}	
	
	@Temporal(TemporalType.DATE)
	@Column(name = "data_pagamento")	
	public Date getDataDePagamento() {
		return dataDePagamento;
	}
	
	public void setDataDePagamento(Date dataDePagamento) {
		this.dataDePagamento = dataDePagamento;
	}
	
	public String getObservacao() {
		return observacao;
	}
	
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}
	
	@Transient
	public boolean isDespesaFixa() {
		return TipoDeDespesa.FIXA.equals(this.tipo);
	}
	
	@Transient
	public boolean isDespesaFlutuante() {
		return TipoDeDespesa.FLUTUANTE.equals(this.tipo);
	}	
	
}